using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._DataManagementTools._Raster._OrthoMapping
{
    /// <summary>
    /// <para>Compute Fiducials</para>
    /// <para>Computes the fiducial coordinates in image and film space for each image in a mosaic dataset.</para>
    /// <para>计算镶嵌数据集中每个影像在影像和胶片空间中的基准坐标。</para>
    /// </summary>    
    [DisplayName("Compute Fiducials")]
    public class ComputeFiducials : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public ComputeFiducials()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_mosaic_dataset">
        /// <para>Mosaic Dataset</para>
        /// <para>The mosaic dataset created from scanned aerial photos using scanned raster type or frame camera raster type.</para>
        /// <para>使用扫描栅格类型或帧相机栅格类型从扫描的航空照片创建的镶嵌数据集。</para>
        /// </param>
        /// <param name="_out_fiducial_table">
        /// <para>Output Fiducial Table</para>
        /// <para>The output table that stores all the fiducial coordinate information in image and film space.</para>
        /// <para>在图像和胶片空间中存储所有基准坐标信息的输出表。</para>
        /// </param>
        public ComputeFiducials(object _in_mosaic_dataset, object _out_fiducial_table)
        {
            this._in_mosaic_dataset = _in_mosaic_dataset;
            this._out_fiducial_table = _out_fiducial_table;
        }
        public override string ToolboxName => "Data Management Tools";

        public override string ToolName => "Compute Fiducials";

        public override string CallName => "management.ComputeFiducials";

        public override List<string> AcceptEnvironments => ["parallelProcessingFactor", "scratchWorkspace", "workspace"];

        public override object[] ParameterInfo => [_in_mosaic_dataset, _out_fiducial_table, _where_clause, _fiducial_templates, _film_coordinate_system.GetGPValue()];

        /// <summary>
        /// <para>Mosaic Dataset</para>
        /// <para>The mosaic dataset created from scanned aerial photos using scanned raster type or frame camera raster type.</para>
        /// <para>使用扫描栅格类型或帧相机栅格类型从扫描的航空照片创建的镶嵌数据集。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Mosaic Dataset")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_mosaic_dataset { get; set; }


        /// <summary>
        /// <para>Output Fiducial Table</para>
        /// <para>The output table that stores all the fiducial coordinate information in image and film space.</para>
        /// <para>在图像和胶片空间中存储所有基准坐标信息的输出表。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Fiducial Table")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_fiducial_table { get; set; }


        /// <summary>
        /// <para>Query Definition</para>
        /// <para>A query definition string that defines a subset of rasters for computing fiducials.</para>
        /// <para>一个查询定义字符串，用于定义用于计算基准点的栅格子集。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Query Definition")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _where_clause { get; set; } = null;


        /// <summary>
        /// <para>Fiducial Templates</para>
        /// <para>The fiducial template table that contains required fields for storing fiducial pictures and other properties.</para>
        /// <para>基准模板表，其中包含用于存储基准图片和其他属性的必填字段。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Fiducial Templates")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _fiducial_templates { get; set; } = null;


        /// <summary>
        /// <para>Film Coordinate System</para>
        /// <para><xdoc>
        ///   <para>A keyword that defines the film coordinate system of the scanned aerial photograph. It is used in computing fiducial information and affine transformation construction.</para>
        ///   <bulletList>
        ///     <bullet_item>No change—Maintain the coordinate system of the mosaic dataset. Do not change the film coordinate system of the scanned aerial photograph. Maintain the coordinate system of the mosaic dataset.</bullet_item><para/>
        ///     <bullet_item>X right, Y up—The origin of the scanned photo's coordinate system is the center, and positive X points right and positive Y points up.</bullet_item><para/>
        ///     <bullet_item>X up, Y left—The origin of the scanned photo's coordinate system is the center, and positive X points up and positive Y points left.</bullet_item><para/>
        ///     <bullet_item>X left, Y down—The origin of the scanned photo's coordinate system is the center, and positive X points left and positive Y points down.</bullet_item><para/>
        ///     <bullet_item>X down, Y right—The origin of the scanned photo's coordinate system is the center, and positive X points down and positive Y points right.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>定义扫描航空照片的胶片坐标系的关键字。它用于计算基准信息和仿射变换构造。</para>
        ///   <bulletList>
        ///     <bullet_item>无更改 - 维护镶嵌数据集的坐标系。请勿更改扫描航拍照片的胶片坐标系。维护镶嵌数据集的坐标系。</bullet_item><para/>
        ///     <bullet_item>X 右，Y 朝上 - 扫描照片坐标系的原点是中心，正 X 指向右，正 Y 指向上方。</bullet_item><para/>
        ///     <bullet_item>X 向上，Y 向左 - 扫描照片坐标系的原点是中心，正 X 指向上方，正 Y 指向左侧。</bullet_item><para/>
        ///     <bullet_item>X 左，Y 向下 - 扫描照片坐标系的原点是中心，正 X 指向左，正 Y 指向向下。</bullet_item><para/>
        ///     <bullet_item>X 向下，Y 向右 - 扫描照片坐标系的原点是中心，正 X 指向下方，正 Y 指向右侧。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Film Coordinate System")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _film_coordinate_system_value _film_coordinate_system { get; set; } = _film_coordinate_system_value._NO_CHANGE;

        public enum _film_coordinate_system_value
        {
            /// <summary>
            /// <para>No change</para>
            /// <para>No change—Maintain the coordinate system of the mosaic dataset. Do not change the film coordinate system of the scanned aerial photograph. Maintain the coordinate system of the mosaic dataset.</para>
            /// <para>无更改 - 维护镶嵌数据集的坐标系。请勿更改扫描航拍照片的胶片坐标系。维护镶嵌数据集的坐标系。</para>
            /// </summary>
            [Description("No change")]
            [GPEnumValue("NO_CHANGE")]
            _NO_CHANGE,

            /// <summary>
            /// <para>X right, Y up</para>
            /// <para>X right, Y up—The origin of the scanned photo's coordinate system is the center, and positive X points right and positive Y points up.</para>
            /// <para>X 右，Y 朝上 - 扫描照片坐标系的原点是中心，正 X 指向右，正 Y 指向上方。</para>
            /// </summary>
            [Description("X right, Y up")]
            [GPEnumValue("X_RIGHT_Y_UP")]
            _X_RIGHT_Y_UP,

            /// <summary>
            /// <para>X up, Y left</para>
            /// <para>X up, Y left—The origin of the scanned photo's coordinate system is the center, and positive X points up and positive Y points left.</para>
            /// <para>X 向上，Y 向左 - 扫描照片坐标系的原点是中心，正 X 指向上方，正 Y 指向左侧。</para>
            /// </summary>
            [Description("X up, Y left")]
            [GPEnumValue("X_UP_Y_LEFT")]
            _X_UP_Y_LEFT,

            /// <summary>
            /// <para>X left, Y down</para>
            /// <para>X left, Y down—The origin of the scanned photo's coordinate system is the center, and positive X points left and positive Y points down.</para>
            /// <para>X 左，Y 向下 - 扫描照片坐标系的原点是中心，正 X 指向左，正 Y 指向向下。</para>
            /// </summary>
            [Description("X left, Y down")]
            [GPEnumValue("X_LEFT_Y_DOWN")]
            _X_LEFT_Y_DOWN,

            /// <summary>
            /// <para>X down, Y right</para>
            /// <para>X down, Y right—The origin of the scanned photo's coordinate system is the center, and positive X points down and positive Y points right.</para>
            /// <para>X 向下，Y 向右 - 扫描照片坐标系的原点是中心，正 X 指向下方，正 Y 指向右侧。</para>
            /// </summary>
            [Description("X down, Y right")]
            [GPEnumValue("X_DOWN_Y_RIGHT")]
            _X_DOWN_Y_RIGHT,

        }

        public ComputeFiducials SetEnv(object parallelProcessingFactor = null, object scratchWorkspace = null, object workspace = null)
        {
            base.SetEnv(parallelProcessingFactor: parallelProcessingFactor, scratchWorkspace: scratchWorkspace, workspace: workspace);
            return this;
        }

    }

}